/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package fr.cggveritas.crewintranet.jms.dao.jpacontroller;

import fr.cggveritas.crewintranet.jms.dao.jpacontroller.exceptions.IllegalOrphanException;
import fr.cggveritas.crewintranet.jms.dao.jpacontroller.exceptions.NonexistentEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import fr.cggveritas.crewintranet.jms.entities.CvNationalitetravailleur;
import fr.cggveritas.crewintranet.jms.entities.CvPays;
import java.util.ArrayList;
import java.util.List;
import fr.cggveritas.crewintranet.jms.entities.CvTelephonetavaleur;
import javax.persistence.EntityManager;

/**
 *
 * @author Alassane
 */
public class CvPaysJpaController extends DaoImp implements Serializable {

    public CvPaysJpaController() {
        super();
    }

    public void create(CvPays cvPays) {
        if (cvPays.getCvNationalitetravailleurList() == null) {
            cvPays.setCvNationalitetravailleurList(new ArrayList<CvNationalitetravailleur>());
        }
        if (cvPays.getCvTelephonetavaleurList() == null) {
            cvPays.setCvTelephonetavaleurList(new ArrayList<CvTelephonetavaleur>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            List<CvNationalitetravailleur> attachedCvNationalitetravailleurList = new ArrayList<CvNationalitetravailleur>();
            for (CvNationalitetravailleur cvNationalitetravailleurListCvNationalitetravailleurToAttach : cvPays.getCvNationalitetravailleurList()) {
                cvNationalitetravailleurListCvNationalitetravailleurToAttach = em.getReference(cvNationalitetravailleurListCvNationalitetravailleurToAttach.getClass(), cvNationalitetravailleurListCvNationalitetravailleurToAttach.getCvNationalitetravailleurPK());
                attachedCvNationalitetravailleurList.add(cvNationalitetravailleurListCvNationalitetravailleurToAttach);
            }
            cvPays.setCvNationalitetravailleurList(attachedCvNationalitetravailleurList);
            List<CvTelephonetavaleur> attachedCvTelephonetavaleurList = new ArrayList<CvTelephonetavaleur>();
            for (CvTelephonetavaleur cvTelephonetavaleurListCvTelephonetavaleurToAttach : cvPays.getCvTelephonetavaleurList()) {
                cvTelephonetavaleurListCvTelephonetavaleurToAttach = em.getReference(cvTelephonetavaleurListCvTelephonetavaleurToAttach.getClass(), cvTelephonetavaleurListCvTelephonetavaleurToAttach.getId());
                attachedCvTelephonetavaleurList.add(cvTelephonetavaleurListCvTelephonetavaleurToAttach);
            }
            cvPays.setCvTelephonetavaleurList(attachedCvTelephonetavaleurList);
            em.persist(cvPays);
            for (CvNationalitetravailleur cvNationalitetravailleurListCvNationalitetravailleur : cvPays.getCvNationalitetravailleurList()) {
                CvPays oldCvPaysOfCvNationalitetravailleurListCvNationalitetravailleur = cvNationalitetravailleurListCvNationalitetravailleur.getCvPays();
                cvNationalitetravailleurListCvNationalitetravailleur.setCvPays(cvPays);
                cvNationalitetravailleurListCvNationalitetravailleur = em.merge(cvNationalitetravailleurListCvNationalitetravailleur);
                if (oldCvPaysOfCvNationalitetravailleurListCvNationalitetravailleur != null) {
                    oldCvPaysOfCvNationalitetravailleurListCvNationalitetravailleur.getCvNationalitetravailleurList().remove(cvNationalitetravailleurListCvNationalitetravailleur);
                    oldCvPaysOfCvNationalitetravailleurListCvNationalitetravailleur = em.merge(oldCvPaysOfCvNationalitetravailleurListCvNationalitetravailleur);
                }
            }
            for (CvTelephonetavaleur cvTelephonetavaleurListCvTelephonetavaleur : cvPays.getCvTelephonetavaleurList()) {
                CvPays oldCvPaysIdOfCvTelephonetavaleurListCvTelephonetavaleur = cvTelephonetavaleurListCvTelephonetavaleur.getCvPaysId();
                cvTelephonetavaleurListCvTelephonetavaleur.setCvPaysId(cvPays);
                cvTelephonetavaleurListCvTelephonetavaleur = em.merge(cvTelephonetavaleurListCvTelephonetavaleur);
                if (oldCvPaysIdOfCvTelephonetavaleurListCvTelephonetavaleur != null) {
                    oldCvPaysIdOfCvTelephonetavaleurListCvTelephonetavaleur.getCvTelephonetavaleurList().remove(cvTelephonetavaleurListCvTelephonetavaleur);
                    oldCvPaysIdOfCvTelephonetavaleurListCvTelephonetavaleur = em.merge(oldCvPaysIdOfCvTelephonetavaleurListCvTelephonetavaleur);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(CvPays cvPays) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            CvPays persistentCvPays = em.find(CvPays.class, cvPays.getId());
            List<CvNationalitetravailleur> cvNationalitetravailleurListOld = persistentCvPays.getCvNationalitetravailleurList();
            List<CvNationalitetravailleur> cvNationalitetravailleurListNew = cvPays.getCvNationalitetravailleurList();
            List<CvTelephonetavaleur> cvTelephonetavaleurListOld = persistentCvPays.getCvTelephonetavaleurList();
            List<CvTelephonetavaleur> cvTelephonetavaleurListNew = cvPays.getCvTelephonetavaleurList();
            List<String> illegalOrphanMessages = null;
            for (CvNationalitetravailleur cvNationalitetravailleurListOldCvNationalitetravailleur : cvNationalitetravailleurListOld) {
                if (!cvNationalitetravailleurListNew.contains(cvNationalitetravailleurListOldCvNationalitetravailleur)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain CvNationalitetravailleur " + cvNationalitetravailleurListOldCvNationalitetravailleur + " since its cvPays field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<CvNationalitetravailleur> attachedCvNationalitetravailleurListNew = new ArrayList<CvNationalitetravailleur>();
            for (CvNationalitetravailleur cvNationalitetravailleurListNewCvNationalitetravailleurToAttach : cvNationalitetravailleurListNew) {
                cvNationalitetravailleurListNewCvNationalitetravailleurToAttach = em.getReference(cvNationalitetravailleurListNewCvNationalitetravailleurToAttach.getClass(), cvNationalitetravailleurListNewCvNationalitetravailleurToAttach.getCvNationalitetravailleurPK());
                attachedCvNationalitetravailleurListNew.add(cvNationalitetravailleurListNewCvNationalitetravailleurToAttach);
            }
            cvNationalitetravailleurListNew = attachedCvNationalitetravailleurListNew;
            cvPays.setCvNationalitetravailleurList(cvNationalitetravailleurListNew);
            List<CvTelephonetavaleur> attachedCvTelephonetavaleurListNew = new ArrayList<CvTelephonetavaleur>();
            for (CvTelephonetavaleur cvTelephonetavaleurListNewCvTelephonetavaleurToAttach : cvTelephonetavaleurListNew) {
                cvTelephonetavaleurListNewCvTelephonetavaleurToAttach = em.getReference(cvTelephonetavaleurListNewCvTelephonetavaleurToAttach.getClass(), cvTelephonetavaleurListNewCvTelephonetavaleurToAttach.getId());
                attachedCvTelephonetavaleurListNew.add(cvTelephonetavaleurListNewCvTelephonetavaleurToAttach);
            }
            cvTelephonetavaleurListNew = attachedCvTelephonetavaleurListNew;
            cvPays.setCvTelephonetavaleurList(cvTelephonetavaleurListNew);
            cvPays = em.merge(cvPays);
            for (CvNationalitetravailleur cvNationalitetravailleurListNewCvNationalitetravailleur : cvNationalitetravailleurListNew) {
                if (!cvNationalitetravailleurListOld.contains(cvNationalitetravailleurListNewCvNationalitetravailleur)) {
                    CvPays oldCvPaysOfCvNationalitetravailleurListNewCvNationalitetravailleur = cvNationalitetravailleurListNewCvNationalitetravailleur.getCvPays();
                    cvNationalitetravailleurListNewCvNationalitetravailleur.setCvPays(cvPays);
                    cvNationalitetravailleurListNewCvNationalitetravailleur = em.merge(cvNationalitetravailleurListNewCvNationalitetravailleur);
                    if (oldCvPaysOfCvNationalitetravailleurListNewCvNationalitetravailleur != null && !oldCvPaysOfCvNationalitetravailleurListNewCvNationalitetravailleur.equals(cvPays)) {
                        oldCvPaysOfCvNationalitetravailleurListNewCvNationalitetravailleur.getCvNationalitetravailleurList().remove(cvNationalitetravailleurListNewCvNationalitetravailleur);
                        oldCvPaysOfCvNationalitetravailleurListNewCvNationalitetravailleur = em.merge(oldCvPaysOfCvNationalitetravailleurListNewCvNationalitetravailleur);
                    }
                }
            }
            for (CvTelephonetavaleur cvTelephonetavaleurListOldCvTelephonetavaleur : cvTelephonetavaleurListOld) {
                if (!cvTelephonetavaleurListNew.contains(cvTelephonetavaleurListOldCvTelephonetavaleur)) {
                    cvTelephonetavaleurListOldCvTelephonetavaleur.setCvPaysId(null);
                    cvTelephonetavaleurListOldCvTelephonetavaleur = em.merge(cvTelephonetavaleurListOldCvTelephonetavaleur);
                }
            }
            for (CvTelephonetavaleur cvTelephonetavaleurListNewCvTelephonetavaleur : cvTelephonetavaleurListNew) {
                if (!cvTelephonetavaleurListOld.contains(cvTelephonetavaleurListNewCvTelephonetavaleur)) {
                    CvPays oldCvPaysIdOfCvTelephonetavaleurListNewCvTelephonetavaleur = cvTelephonetavaleurListNewCvTelephonetavaleur.getCvPaysId();
                    cvTelephonetavaleurListNewCvTelephonetavaleur.setCvPaysId(cvPays);
                    cvTelephonetavaleurListNewCvTelephonetavaleur = em.merge(cvTelephonetavaleurListNewCvTelephonetavaleur);
                    if (oldCvPaysIdOfCvTelephonetavaleurListNewCvTelephonetavaleur != null && !oldCvPaysIdOfCvTelephonetavaleurListNewCvTelephonetavaleur.equals(cvPays)) {
                        oldCvPaysIdOfCvTelephonetavaleurListNewCvTelephonetavaleur.getCvTelephonetavaleurList().remove(cvTelephonetavaleurListNewCvTelephonetavaleur);
                        oldCvPaysIdOfCvTelephonetavaleurListNewCvTelephonetavaleur = em.merge(oldCvPaysIdOfCvTelephonetavaleurListNewCvTelephonetavaleur);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = cvPays.getId();
                if (findCvPays(id) == null) {
                    throw new NonexistentEntityException("The cvPays with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            CvPays cvPays;
            try {
                cvPays = em.getReference(CvPays.class, id);
                cvPays.getId();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The cvPays with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            List<CvNationalitetravailleur> cvNationalitetravailleurListOrphanCheck = cvPays.getCvNationalitetravailleurList();
            for (CvNationalitetravailleur cvNationalitetravailleurListOrphanCheckCvNationalitetravailleur : cvNationalitetravailleurListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This CvPays (" + cvPays + ") cannot be destroyed since the CvNationalitetravailleur " + cvNationalitetravailleurListOrphanCheckCvNationalitetravailleur + " in its cvNationalitetravailleurList field has a non-nullable cvPays field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            List<CvTelephonetavaleur> cvTelephonetavaleurList = cvPays.getCvTelephonetavaleurList();
            for (CvTelephonetavaleur cvTelephonetavaleurListCvTelephonetavaleur : cvTelephonetavaleurList) {
                cvTelephonetavaleurListCvTelephonetavaleur.setCvPaysId(null);
                cvTelephonetavaleurListCvTelephonetavaleur = em.merge(cvTelephonetavaleurListCvTelephonetavaleur);
            }
            em.remove(cvPays);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<CvPays> findCvPaysEntities() {
        return findCvPaysEntities(true, -1, -1);
    }

    public List<CvPays> findCvPaysEntities(int maxResults, int firstResult) {
        return findCvPaysEntities(false, maxResults, firstResult);
    }

    private List<CvPays> findCvPaysEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(CvPays.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public CvPays findCvPays(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(CvPays.class, id);
        } finally {
            em.close();
        }
    }

    public int getCvPaysCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<CvPays> rt = cq.from(CvPays.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
